package com.bdqn.ch01.Sl;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * AccessPersonConstructors
 * 示例7
 * @aurhor Administrator  whs
 * @since 2024/6/26
 */
public class AccessPersonConstructors {
    public static void main(String[] args) {

        //测试反射调用构造方法

        try {
            Class clz = Class.forName("com.bdqn.ch01.Sl.Person");
            Object obj = clz.newInstance();
            System.out.println(obj);

            // 获取 Person 的无参构造
            Constructor c1 = clz.getDeclaredConstructor();
            // Person 的无参构造为 public 这里可以直接访问
            obj = c1.newInstance();
            System.out.println(obj);

            // 获取 Person 的单参数
            Constructor c2 = clz.getDeclaredConstructor(String.class);
            // Person 的单参数为private , 这里已经超出其访问范围 ，不能直接访问
            // 通过 setAccessible 方法 可以访问到
            c2.setAccessible(true);
            obj = c2.newInstance("New Person"); // new Person("new Person")
            System.out.println(obj);

            // 获取 Person 的三参数
            Constructor c3 = clz.getDeclaredConstructor(String.class,String.class,String.class);
            // Person 的三参数为private , 这里已经超出其访问范围 ，不能直接访问
            // 通过 setAccessible 方法 可以访问到
            c3.setAccessible(true);
            obj = c3.newInstance("New Person","beijing","Hello!"); // new Person("new Person")
            System.out.println(obj);


        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (InvocationTargetException e) {
            throw new RuntimeException(e);
        } catch (InstantiationException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        }

    }
}
